package com.wr.email.send;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

/**
 * 邮件创建步骤:
	创建一个邮件对象（MimeMessage）；
	设置发件人，收件人，可选增加多个收件人，抄送人，密送人；
	设置邮件的主题（标题）；
	设置邮件的正文（内容）；
	设置显示的发送时间；
	保存到本地。
 * @author 10323
 *
 */
public class SimpleSendEmail {
	//发送方邮箱账户信息
	public static String myEmailAccount = "1032337540@qq.com";
    public static String myEmailPassword = "dmisurikslelbcea";	//账户密码 或者授权码 否则错误 LOGIN FAILD
    
    // 发件人邮箱的 SMTP 服务器地址, 必须准确,
    // 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
    // 需要开启stmp服务器 
    // 端口465或587
    public static String myEmailSMTPHost = "smtp.qq.com";
    
    // 收件人邮箱（替换为自己知道的有效邮箱）
    public static String receiveMailAccount = "364102530@qq.com";
    
    public static void main(String[] args) throws Exception {
		Properties properties=new Properties();	//参数
		properties.setProperty("mail.transport.protocol", "smtp");   // 使用的协议（JavaMail规范要求）
		properties.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
		properties.setProperty("mail.smtp.auth", "true");            // 需要请求认证
		
		//某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证
		// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
        //                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
        //                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
		final String smtpPort = "465";
        properties.setProperty("mail.smtp.port", smtpPort);
        properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        properties.setProperty("mail.smtp.socketFactory.fallback", "false");
        properties.setProperty("mail.smtp.socketFactory.port", smtpPort);
        properties.setProperty("mail.smtp.starttls.enable", "true");
        
        //根据配置创建会话对象, 用于和邮件服务器交互
        Session session=Session.getInstance(properties);
        session.setDebug(true);	//开启调试
        
        //创建邮件
        MimeMessage message=createMimeMessage(session, myEmailAccount, receiveMailAccount);
        
        // 4. 根据 Session 获取邮件传输对象
        Transport transport = session.getTransport();
        
        //连接到发送方的email(自己的EMAIL)
        transport.connect(myEmailAccount, myEmailPassword);

        // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());
        
        // 7. 关闭连接
        transport.close();
	}
    
    public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
        // 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);

        // 2. From: 发件人（昵称有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改昵称）
        message.setFrom(new InternetAddress(sendMail, "王锐", "UTF-8"));

        // 3. To: 收件人（可以增加多个收件人、抄送、密送）
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "王锐2", "UTF-8"));

        // 4. Subject: 邮件主题（标题有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改标题）
        message.setSubject("测试Email", "UTF-8");

        //创建图片节点
        MimeBodyPart image=new MimeBodyPart();
        DataHandler dh=new DataHandler(new FileDataSource("F:\\SendImg.jpg"));//读取本地文件
        image.setDataHandler(dh);
        image.setContentID("image");	//设置节点ID
        
        //创建文本节点 用于显示图片节点
        MimeBodyPart text=new MimeBodyPart();
        text.setContent("<h1>测试图片</h1><hr><img src='cid:image' title='测试图片' width='50%' heigth='50%'/>","text/html;charset=UTF-8");
        
        //设置图片*文本 混合节点显示
        MimeMultipart mm_text_image=new MimeMultipart();
        mm_text_image.addBodyPart(image);
        mm_text_image.addBodyPart(text);
        mm_text_image.setSubType("related");	//设置为关联关系，将图片和文本关联起来
        
        //将(图片*文本 混合节点)MimeMultipart转化为MimeBodyPart
        MimeBodyPart text_image=new MimeBodyPart();
        text_image.setContent(mm_text_image);
        
        //创建下载节点
        MimeBodyPart attachment=new MimeBodyPart();
        attachment.setDataHandler(dh);
        attachment.setFileName(dh.getName());
        
        //将下载节点 和 （图片*文本 混合节点）混合
        MimeMultipart mm=new MimeMultipart();
        mm.addBodyPart(text_image);
        mm.addBodyPart(attachment);
        mm.setSubType("mixed");
        
        // 5. Content: 邮件正文（可以使用html标签）（内容有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改发送内容）
        message.setContent(mm);

        // 6. 设置发件时间
        message.setSentDate(new Date());

        // 7. 保存设置
        message.saveChanges();

        return message;
    }
}
